//@原文链接：https://blog.csdn.net/ITSOK_123/article/details/123933656

//从外到内顺时针模拟
class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> res(n,vector<int>(n,0));
        int loop = n/2,mid = n/2;    //循环几圈
        int x =0 ,y=0;      //每圈的起始位置
        int ptr = 1;        //圈内循环计数，用来控制每行每列的元素数
        int val = 1;        //赋值自变量
        //顺时针打印（行列行列）
        while(loop--){
            int i =x,j=y;
            //横向填充上面一行
            for(j = y;j<y+n-ptr;j++){
                res[i][j] = val++;
            }
            //纵向填充右边一列
            for(i = x;i<x+n-ptr;i++){
                res[i][j] = val++;
            }
            //横向填充下面一行
            for(;j>y;j--){
                res[i][j] = val++;
            }
            //纵向填充左边一列
            for(;i>x;i--){
                res[i][j]=val++;
            }
            x++;
            y++;
            ptr+=2;     //此时每行的元素数减2
        }
        if(n%2){
            res[mid][mid]=val;
        }
        return res;
    }
};


//四个边界条件模拟
class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        // 创建二维矩阵
        vector<vector<int>> matrix(n,vector<int>(n,0));
        // 上下左右四个边界
        int t = 0;
        int b = n-1;
        int l = 0;
        int r = n-1;
        int val = 1,target = n*n;

        while(val<=target){
            // 上
            for(int i=l; i <= r; i++) matrix[t][i] = val++;
            t++;
            // 右
            for(int i=t; i <= b; i++) matrix[i][r] = val++;
            r--;
            // 下
            for(int i=r; i >= l; i--) matrix[b][i] = val++;
            b--;
            // 左
            for(int i=b; i >= t; i--) matrix[i][l] = val++;
            l++;
        }
        return matrix;
    }
};
